import 'package:aio/aio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_overlay_window/flutter_overlay_window.dart';
import 'package:flutter/services.dart';
import 'package:myapp/generated/app_strings.dart';

class FloatingWindowService {
  ///fixme 判断是否有悬浮窗的权限。
  static Future<bool> checkPermission() async {
    try {
      bool hasPermission = await FlutterOverlayWindow.isPermissionGranted();
      // print('悬浮窗权限状态: $hasPermission');
      return hasPermission;
    } catch (e) {
      print('检查权限时出错: $e');
      return false;
    }
  }

  ///fixme 请求申请悬浮窗权限。
  static Future<void> requestPermission(BuildContext context) async {
    if (!await checkPermission()) {
      final strings = AppStrings.of(context);
      if (strings == null) {
        print('本地化字符串未初始化');
        return;
      }

      var floatingWindowPermissionTitle =
          strings.floatingWindowPermissionTitle; //需要悬浮窗权限
      var floatingWindowPermissionContent =
          strings.floatingWindowPermissionContent; //请在设置中开启悬浮窗权限
      var floatingWindowPermissionSettings =
          strings.floatingWindowPermissionSettings; //去设置
      var floatingWindowPermissionCancel =
          strings.floatingWindowPermissionCancel; //取消

      showDialog(
        context: context,
        builder: (context) => AlertDialog(
          title: Text(floatingWindowPermissionTitle),
          content: Text(floatingWindowPermissionContent),
          actions: [
            TextButton(
              onPressed: () async {
                Navigator.pop(context);
                try {
                  await FlutterOverlayWindow.requestPermission();
                } catch (e) {
                  print('请求权限时出错: $e');
                }
              },
              child: Text(floatingWindowPermissionSettings),
            ),
            TextButton(
              onPressed: () => Navigator.pop(context),
              child: Text(floatingWindowPermissionCancel),
            ),
          ],
        ),
      );
    }
  }

  ///fixme 注意：FlutterOverlayWindow.showOverlay()里的宽高，单位是px物理像素。不是逻辑像素dp
  static double width = 56 * 3.5; //正常悬浮球的大小是56dp,而56dp大约等于112px
  static double height = 56 * 3.5; //乘2感觉还是小了一点，乘以3刚好合适。等于168

  ///fixme 判断悬浮球是否已经显示，防止重复调用showFloatingWindow()方法。
  static bool isShowFloatingWindow = false;

  ///context 上下文，主要用于px计算悬浮球的起始位置。
  ///floatingWindowTitle 显示悬浮球之前，发送通知的标题。
  ///floatingWindowBody 通知内容。
  ///显示悬浮球。
  static Future<bool> showFloatingWindow(BuildContext? context,
      String? floatingWindowTitle, String floatingWindowBody) async {
    ///fixme 重复调用showFloatingWindow(),会关闭悬浮球的。
    if (isShowFloatingWindow) {
      return true;
    }
    try {
      // print('尝试显示悬浮窗');

      if (!await checkPermission()) {
        print('没有悬浮窗权限');
        return false;
      }
      px.init(context);
      OverlayPosition? _overlayPosition = null;
      //fixme 悬浮球的起始位置。
      if (context != null) {
        var x = px.screenWidth() / 3;
        var y = px.screenHeight() / 3;
        //fixme 注意：OverlayPosition 单位是dp,测试发现：坐标位置，屏幕中心点是(0,0)
        //fixme x 负数，左移。正数右移；y 负数上移。正数下移。
        _overlayPosition = OverlayPosition(x, -y); //这里我们设置在右上角的位置。
      }

      // print('开始显示悬浮窗');

      // 创建悬浮球
      // print('调用FlutterOverlayWindow.showOverlay');
      await FlutterOverlayWindow.showOverlay(
        //悬浮球，是否具备拖动功能。
        enableDrag: true,

        ///fixme 悬浮球，显示的时候，系统会自动发一个notification通知栏消息，主动提示用户。这个没办法。这个通知栏，点击之后，目前没人任何效果。
        ///overlayTitle 是通知栏的标题，overlayContent通知栏的内容。
        overlayTitle: floatingWindowTitle ?? "",
        overlayContent: floatingWindowBody,
        // 使用不可聚焦的flag
        flag: OverlayFlag.flagNotFocusable,
        positionGravity: PositionGravity.none,
        //startPosition 起始位置
        startPosition: _overlayPosition,
        width: width.toInt(),
        height: height.toInt(),
      );
      isShowFloatingWindow = true;
      // print('悬浮球显示请求已发送');
      return true;
    } catch (e) {
      print('显示悬浮球时出错: $e');
      return false;
    }
  }

  /**
   * fixme 点击悬浮球关闭时(后台进程)，和显示悬浮球的时候(前台进程)，不是同一个进程里。isShowFloatingWindow的值不统一。
   * fixme 所以应用程序初始化的时候，要调用一次 isForce: true ，FloatingWindowService.closeFloatingWindow(isForce: true);
   */

  ///isForce true 强制关闭。
  static Future<bool> closeFloatingWindow({bool isForce = false}) async {
    if (!isShowFloatingWindow && !isForce) {
      return true;
    }
    try {
      await FlutterOverlayWindow.closeOverlay();
      isShowFloatingWindow = false;
      return true;
    } catch (e) {
      print('关闭悬浮球时出错: $e');
      return false;
    }
  }
}
